﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Persistencia;
using GestorDeFlotasModelo.Entities;
using System.Data.SqlClient;
using Persistencia.Interfaces;

namespace GestorDeFlotasModelo.Factorias
{
    public class FactoriaTurno : Factoria, IIdentityFactory
    {
         private FactoriaTurno(TransaccionBase tran)
            : base(tran)
        {
        }

        public override string NombreTabla
        {
            get { return " NUESTRA_RUBIA_ES_MEJOR.Turno "; }
        }

        protected override IPersistibleModelo NuevoPersistible(HashTableNCSensitive htsNc)
        {
            return new Turno();
        }

        protected override string Id(HashTableNCSensitive hts)
        {
            return hts["Turno_Id"].ToString();
        }

        protected override HashTableNCSensitive ParametrosClave()
        {
            HashTableNCSensitive parameters = new HashTableNCSensitive();
            parameters.Add("Turno_Id", null);
            return parameters;
        }

        protected override HashTableNCSensitive ParametrosNoClave()
        {
            HashTableNCSensitive parameters = new HashTableNCSensitive();
            parameters.Add("Turno_Descripcion", null);
            parameters.Add("Turno_Habilitado", null);
            parameters.Add("Turno_Hora_Inicio", null);
            parameters.Add("Turno_Hora_Fin", null);
            parameters.Add("Turno_Valor_Bandera", null);
            parameters.Add("Turno_Valor_Ficha", null);
            return parameters;
        }


        protected override Predicate<IPersistibleModelo> FiltroXId(string id)
        {
            return delegate(IPersistibleModelo iPer)
            {
                return ((Turno)iPer).Id == long.Parse(id);
            };
        }

        public List<Turno> SelectTodosHabilitados()
        {
            SqlCommand comm = new SqlCommand();
            string consulta = "SELECT * FROM "+this.NombreTabla+" WHERE Turno_Habilitado=1";
            comm.CommandText=consulta;
            return base.Select<Turno>(comm, delegate(IPersistibleModelo iPer) { return ((Turno)iPer).Habilitado; });
        }

        public Turno Nuevo(string descripcion, int horaInicio, int horaFin, double valorFicha, double valorBandera)
        {
            Turno t = new Turno();
            t.Descripcion = descripcion;
            t.HoraInicio = horaInicio;
            t.HoraFin = horaFin;
            t.ValorBandera = valorBandera;
            t.ValorFicha = valorFicha;
            t.Habilitado = true;
            base.Agregar(t);
            return t;
        }

        public List<Turno> SelectTurno(string descripcion)
        {
            SqlCommand comm = new SqlCommand();
            string consulta = "SELECT * FROM " + this.NombreTabla;
            if (descripcion != null && descripcion.Trim() != String.Empty)
                consulta += " WHERE Turno_Descripcion LIKE '%"+descripcion+"%'";
            consulta += "ORDER BY Turno_Hora_Inicio, Turno_Id";
            comm.CommandText = consulta;
            List<Turno> turnos= base.Select<Turno>(comm, delegate(IPersistibleModelo iPer)
            {
                return ((descripcion == null || descripcion.Trim() == String.Empty) || ((Turno)iPer).Descripcion.ToLower().Contains(descripcion.ToLower()));
            });

            turnos.Sort(delegate(Turno t1, Turno t2)
            {
                if (t1.HoraInicio.CompareTo(t2.HoraInicio) == 0)
                    return t1.Id.CompareTo(t2.Id);

                return t1.HoraInicio.CompareTo(t2.HoraInicio);
            });

            return turnos;
        }
    }
}
